import axios, { AxiosInstance } from 'axios'
import type { IRequestInterceptors, IRequestConfig } from './type'
import { configSetParam } from "@/utils";
import { showToast } from 'vant'

const router = useRouter()
const config = {
  baseURL: configSetParam.baseUrl,
  timeout: 3000000,
  headers: { 'Content-Type': 'application/json' }
}
// 定义一个IRequest 类用于发送axios的请求
class IRequest {
  // 定义一个axios实例属性
  instance: AxiosInstance
  // 定义一个拦截器属性
  interceptors?: IRequestInterceptors
  // 利用构造函数要求传入使用 IRequest类时传入参数
  constructor(config: IRequestConfig) {
    this.instance = axios.create(config) // 把axios实例赋给instance
    this.interceptors = config.interceptors // 把传入的拦截器赋值给interceptors
    // 添加所有的实例公共拦截
    this.instance.interceptors.request.use( // 请求拦截
      (config) => {
        config.headers.Authorization = `Bearer ${configSetParam.token}`
        return config
      },
      (err) => {
        return err
      }
    )
    this.instance.interceptors.response.use( // 响应拦截
      (res) => {
        console.log('res----', res)
        if (res.status === 200) {
          return res.data
        } else {
          showToast(res.statusText || '调用失败！')
        }
        // if (res.data.hasOwnProperty('code')) {
        //   // 0 表示调用成功，其他值表示调用失败
        //   if (res.data.code === 0) {
        //     return res.data
        //   } else {
        //     localStorage.clear()
        //     showToast(res.data.code + ':' + res.data.msg || '调用失败！')
        //   }
        // } else {
        //   if (res.data?.[0]?.rtnmsg) {
        //     return Promise.reject(res.data?.[0]?.rtnmsg)
        //   }
        //   return res.data
        // }
      },
      (err) => {
        return Promise.reject(err)
      }
    )
  }
  request<T = any>(config: IRequestConfig<T>): Promise<T> {
    return new Promise((resolve, reject) => {
      // 1.单个请求对请求config的处理
      if (config.interceptors?.requestInterceptor) {
        config = config.interceptors.requestInterceptor(config)
      }
      this.instance.request<any, T>(config).then((res) => {
        // 1.单个请求对数据的处理
        if (config.interceptors?.responseInterceptor) {
          res = config.interceptors.responseInterceptor(res)
        }
        // 将结果resolve返回出去
        resolve(res)
      })
        .catch((err: any) => {
          reject(err)
          return err
        })
    })
  }
  // 定义发送请求的ts类型
  get<T = any>(config: IRequestConfig<T>): Promise<T> {
    return this.request<T>({ ...config, method: 'GET' })
  }

  post<T = any>(config: IRequestConfig<T>): Promise<T> {
    return this.request<T>({ ...config, method: 'POST' })
  }

  delete<T = any>(config: IRequestConfig<T>): Promise<T> {
    return this.request<T>({ ...config, method: 'DELETE' })
  }

  patch<T = any>(config: IRequestConfig<T>): Promise<T> {
    return this.request<T>({ ...config, method: 'PATCH' })
  }
  // OS接口
  fetch<T = any>(config: IRequestConfig<T>): Promise<T> {
    return this.request<T>({ baseURL: configSetParam.osBaseUrl, ...config, method: 'GET' })
  }
}
export default new IRequest(config)

